package IO2024_4_29;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class Night {
    //晚串讲
    //String Object 包装类 集合
    //IO流
    //分类 传输单位分 字节流 字符流
    //字节流 以8位字节为单位 用于处理原始二进制数据 如音频文件等
    //字符流 以16位的Unicode码字符为单位 用于处理常见字符文件

    //输入输出流
    //输入 从源(文件,网络)读取到服务程序(服务器)
    //输出 从服务器写出到数据源

    //节点流和处理流(低级流 高级流)
    //节点流(低级流) 实际去读写数据的流 直接对接文件本身 FileOutputStream FileInputStream
    //处理流(高级流) 不能独立存在 需要连接到其他流上去对接文件

    //实际应用中 我们可以串联一组高级流到某个低级流进行数据处理加工

    //IO包中的类
    //File类 (java.io)
    //概念 代表文件和目录路径名的抽象表示 不代表文件本身
    //作用 创建 删除 获取 设置文件的属性(名称 路径)等 但是不能直接用于文件内容的读取和写入
    //特点 1 File可以是文件也可以是目录
        //2 File是可以跨平台使用的
        //3 不能直接用于文件内容的读取和写入

    //常用方法(***)
    //1 文件,目录检查和创建
    //exists 检查文件,目录是否存在
    //isFile 是不是一个文件
    //isDirectory 是不是一个目录
    //createNewFile 创建一个新的空文件 (如果存在 不创建 不报错)
    //mkdirs 创建多层目录

    //2 文件的信息的获取
    //getName 返回文件名 目录名
    //getPath 返回对象的路径
    //lenght 获取文件长度

    //3 文件操作
    //delete 删除文件

    //4 文件遍历
    //list 返回文件名数组
    //listFile 返回目录下所有File对象数组

    //File注意事项
    //使用File文件操作时 (删除 重命名)之前 检查文件是否存在
    //创建文件或目录时 检查操作的返回值是否确定操作成功

//    InputStream OutputStream(抽象类 节点流)
    //派生类
    //FileOutputStream FileInputStream 低级流 节点流
    //唯二可以直接读取和写入文件中数据的字节流

    //BufferedInputStream BufferedOutputStream 缓冲流
    //读写数据时提供内部缓冲区 减少实际IO操作次数 提高效率

    //ObjectInputStream ObjectOutputStream 反序列化 序列化
    //1 概念
    //序列化 把对象的状态信息转换成可以存储和运输的形式和过程
    //反序列化 把序列化的数据恢复成对象的过程
//    ObjectOutputStream 序列化
//    FileOutputStream fos = new FileOutputStream(".");
//    ObjectOutputStream oos = new ObjectOutputStream(fos);
//    oos.writeObject();
//    oos.close();
    //序列化注意事项
    /*
        要序列化的对象的类必须实现java.io.serializable接口 这只是一个标记接口 不包含任何方法
        如果没有实现 会报异常
        使用transient关键字标记可以忽略序列化(属性)
        静态字段不会被序列化 静态的属于类而非方法 因此不参与序列化过程
        如果一个类可以被序列化 那么其子类也可以被序列化
     */
    //Reader Writer 抽象类 字符流
    //FileReader FileWriter
    //BufferedReader BufferedWriter

    //InputStreamReader OutputStreamWriter 转换流
    //作为字节和字符流的桥梁 可以指定字符集进行读写

    //PrintWriter
    //常用方法
    //print(String s) 输出字符串s
    //println(String s) 输出字符串s并换行
    //特点
    //自动行刷新
    //无需处理字符集
    //使用场景
    //需要写出人类可读的文本数据(日志)
    //输出报表格式要求比较高的场景

    //异常
    //顶级父类 Throwable 可以抛出throw也可以捕获catch
    //子集
    //1 Error 编译时的系统错误 如内存溢出 程序无法处理 代码无法解决
    //2 Exception
        //1 检查异常 在编译时必须捕获或声明的异常 这种异常通常是外部异常 比如文件不存在 网络中断等等
        //必须使用throw或try-catch处理 常见的有IOException
        //2 非检查异常 包括RunTimeException及其子类 都是因为编译不严谨导致 可通过修改代码规避
        //常见 RunTimeException IllegalArgumentException非法参数异常 NullPointException空指针异常
        //ArrayIndexOfBoundException数组下标越界 ClassCastException类型不匹配
    //异常处理关键字
    /*
        try 定义一段可能会抛出异常的代码
        catch 捕获 处理指定类型异常 可以多个
        finally 必须执行 -<try-catch中有return返回语句时 finally仍然在方法返回前执行>-
        throw 用于显示抛出一个异常
        throws 在方法签名上声明该方法可能会抛出的异常
     */
    //JDK1.7之后引入 自然资源管理
//    try (需要且具有关流方法的声明放在里面...){ <------需要实现AutoCloseable或Closeable接口
//        代码块 使用资源...
//    } catch (异常...){
//        处理措施...
//    }
    //会自动调用try()中每个有close()方法的资源的close()方法

    //线程的创建
    //继承Thread类 重写run()方法
    //在测试类继承该类 创建线程对象 调用start()方法

    //实现Runnable接口 重写run()方法
    //在测试类实现该接口 创建Thread对象 再创建Thread类对象 再用类对象打点使用start()方法

    //线程的生命周期
    /*
        1 新建阶段 创建线程对象 还没使用start()方法
        2 就绪状态 调用start()方法 使线程进入可以运行状态 等待CUP调度
        3 运行状态 线程获取CPU执行时间 执行run()方法里面的线程体代码
        4 阻塞 通过调用wait()方法 sleep()方法 sychronized等关键字使得线程放弃CPU使用权 暂时停止运行
        直到线程重新进入就绪状态 才可运行
        4 终止 线程体代码执行完毕 退出run()方法 线程结束
     */

    //Socket
    //1 概念
    //网络通讯的核心组件 运行计算机之间建立网络连接并进行数据交换 是网络应用的基础 不同的Socket
    //和通信协议适用于不同场景 如HTTP协议的Socket UDP协议的Socket
    //2 搭建服务端和客户端
    //服务端 使用ServerSocket类 传端口号参数 如8080 创建一个服务器
        //类名打点accept()方法连接客户端
    //客户端 用Socket的构造方法传2个参 服务器IP地址 服务器端口号 创建一个客户端并向服务端发起连接

    //反射
    //是java的核心机制之一
    //允许运行时查询 访问 修改类的属性 方法 构造器等信息 以及动态创建对象 调用方法

    //反射核心组成
    //1 class类 获取类信息
    //2 field 获取类的成员变量
    //3 Method 获取类的方法
    //4 Constructor 获取类的构造器

    //使用场景
    //运行时了解类和对象的状态
    //动态执行方法
    //动态创建对象

    //优缺点
    //优点 1 灵活度高  2 有助于实现第三方工具的开发 如Spring Mybatis
    //缺点 1 性能开销大 执行速度慢  2 安全问题大 破坏类的封装性 能够访问私有成员  3 可读性差 过多使用反射代码会使代码难以理解和维护

    //自定义注解
    //语法
    //public @interface 注解名称{  定义的元素  }

    //元注解 定义注解的注解
    /*
        1 @Traget 指定注解在java的元素的使用位置(TYPE,METHOD等)
        2 @Retention 指定注解在哪个级别可以使用(源代码未编译SOURCE 类文件CLASS 运行时RUNTIME)
        3 @Document 指定注解可以在文档注释里使用
        4 @Inherited 指定注解有继承性 如果某个类使用了该注解 其子孙类也拥有该注解
     */
}

